-- 判断表中是否包含指定元素
function table.contains(tb, element)
    if(not tb)then return false end

    for k, v in pairs(tb) do
        if v == element then
            return true
        end
    end
    return false
end

-- 获取表中元素的数量
function table.getCount(tb)
    local count = 0
    if(not tb)then return count end

    for k, v in pairs(tb) do
        count = count + 1
    end
    return count
end

-- 获取表的键列表
function table.keys(tb)
    local keys = {}
    if(not tb)then return keys end

    for k, v in pairs(tb) do
        keys[#keys + 1] = k
    end
    return keys
end

-- 获取表的值列表
function table.values(tb)
    local values = {}
    if(not tb)then return values end

    for k, v in pairs(tb) do
        values[#values + 1] = v
    end
    return values
end

-- 将源表中的内容合并到目标表
function table.merge(tb, src)
    if(tb ~= nil and src ~= nil)then
        for k, v in pairs(src) do
            tb[k] = v
        end
    end
end

-- 从数组中移除指定值
function table.removebyvalue(tb, value, removeall)
    local i = 1
    if(not tb)then return end

    while i <= #tb do
        if tb[i] == value then
            table.remove(tb, i)
            if not removeall then break end
        else
            i = i + 1
        end
    end
end

-- 修复 table.insertto 函数
function table.insertto(array, src, begin)
    if(array == nil or src == nil)then return end
    begin = math.max(1, tonumber(begin) or (#array + 1))

    for i, v in pairs(src) do
        table.insert(array, i + begin - 1, v)
    end
end

-- 查找数组中指定值的索引
function table.indexof(array, value, begin)
    if(not array)then return -1 end

    for i = begin or 1, #array do
        if array[i] == value then return i end
    end
    return -1
end

-- 获取表中指定值对应的键
function table.keyof(tb, value, default)
    if(not tb)then return default end

    for k, v in pairs(tb) do
        if v == value then return k end
    end
    return default
end

-- 对表中的元素进行映射处理
function table.map(tb, fn)
    if(tb ~= nil and fn ~= nil)then
        for k, v in pairs(tb) do
            tb[k] = fn(v, k)
        end
    end
end

-- 对表中的元素进行遍历处理
function table.walk(tb, fn)
    if(tb ~= nil and fn ~= nil)then
        for k, v in pairs(tb) do
            fn(v, k)
        end
    end
end

-- 对表中的元素进行筛选处理
function table.filter(tb, fn)
    if(tb ~= nil and fn ~= nil)then
        for k, v in pairs(tb) do

            if not fn(v, k) then
                tb[k] = nil
            end
        end
    end
end

-- 清空表
function table.clear(tb)
    if(not tb)then return end

    for k,v in pairs(tb) do
        tb[k] = nil
    end
end

-- 克隆表
function table.clone(tb)
    local clone = {}
    if(not tb)then
        return clone
    end

    for k,v in pairs(tb) do
        clone[k] = v
    end
    return clone
end